package com.zhou.controller;

import com.google.common.util.concurrent.RateLimiter;
import com.zhou.service.OrderService;
import com.zhou.service.UserService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.Arrays;
import java.util.concurrent.TimeUnit;

@RestController
@RequestMapping("stock")
@Slf4j
public class StockController {
    @Autowired
    private OrderService orderService;
    @Autowired
    private UserService userService;

    private RateLimiter rateLimiter = RateLimiter.create(10);
    //测试令牌桶算法实现接口限流
//    @GetMapping("sale")
//    public String sale(Integer id){
//        if (!rateLimiter.tryAcquire(1, TimeUnit.SECONDS)) {
//            System.out.println("当前请求超时1秒被限流，直接抛弃。。。。。。。。");
//            return "抢购失败！";
//        }
//        System.out.println("处理业务中。。。。。。");
//        return "抢购成功！";
//    }
//
//    //开发秒杀方法,使用数据库的乐观锁机制
//    @GetMapping("kill")
//    public String kill(Integer id){
//        System.out.println("秒杀商品的id = " + id);
//        try {
//            //根据秒杀商品的id 去调用秒杀业务
//            int orderId = orderService.kill(id);
//            return "秒杀成功，订单id为：" + String.valueOf(orderId);
//        }catch (Exception e){
//            e.printStackTrace();
//            return e.getMessage();
//        }
//    }
//
//    //开发秒杀方法,乐观锁+令牌桶限流
//    @GetMapping("killToken")
//    public String killToken(Integer id){
//        System.out.println("秒杀商品的id = " + id);
//        if (!rateLimiter.tryAcquire(2, TimeUnit.SECONDS)) {
//            log.info("请求超时：抢购失败，当前秒杀活动过于火爆，请重试！");
//            return "抢购失败，当前秒杀活动过于火爆，请重试！";
//        }
//        try {
//            //根据秒杀商品的id 去调用秒杀业务
//            int orderId = orderService.kill(id);
//            return "秒杀成功，订单id为：" + String.valueOf(orderId);
//        }catch (Exception e){
//            e.printStackTrace();
//            return e.getMessage();
//        }
//    }

    //乐观锁+令牌桶+接口隐藏
    @GetMapping("killTokenMd5Limit")
    public String killTokenMd5Limit(Integer id, Integer userid, String md5){
        System.out.println("秒杀商品的id = " + id);
        if (!rateLimiter.tryAcquire(2, TimeUnit.SECONDS)) {
            log.info("请求超时：抢购失败，当前秒杀活动过于火爆，请重试！");
            return "抢购失败，当前秒杀活动过于火爆，请重试！";
        }
        try {
            //加入单用户限制调用频率
            int count = userService.saveUserCount(userid);
            log.info("用户截至该次的访问次数为: [{}]", count);
            boolean isBanned = userService.getUserCount(userid);
            if (isBanned) {
                log.info("购买失败,超过频率限制!");
                return "购买失败，超过频率限制!";
            }
            //根据秒杀商品的id 去调用秒杀业务
            int orderId = orderService.kill(id, userid, md5);
            return "秒杀成功，订单id为：" + String.valueOf(orderId);
        }catch (Exception e){
            e.printStackTrace();
            return e.getMessage();
        }
    }

    //生成md5值的方法
    @RequestMapping("md5")
    public String getMd5(Integer id, Integer userid){
        String md5;
        try{
            md5 = orderService.getMd5(id, userid);
        }
        catch (Exception e){
            e.printStackTrace();
            return "获取md5失败" + e.getMessage();
        }
        return "获取md5信息为：" + md5;
    }
}
